package fdupc.crypto.aes;

import fdupc.string.StringManagerUtil;
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import java.nio.charset.Charset;

/**
* 名称: AES处理抽象接口
* @description:
* @author: XXSD
* @date: 2023-06-30 20:59
*/
public interface IAesManager {

    /**
     * 功能名称: 获取向量
     *
     * @param length 长度
     * @return 向量结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 20:30
     */
    default String giveIvData(int length) {
        return StringManagerUtil.randomStr((length <= 0 || length > 16) ? 16 : length);
    }

    /**
     * 功能名称: 获取加密秘钥
     *
     * @param length 长度
     * @return 秘钥结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 20:31
     */
    default String giveKeyData(int length) {
        return StringManagerUtil.randomStr((length <= 0 || length > 32) ? 32 : length);
    }

    /**
     * 功能名称: 编码
     *
     * @param byteArray 明文字节
     * @return 编码结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 19:59
     */
    default String encodeBase64(byte[] byteArray) throws Exception {
        return new BASE64Encoder().encode(byteArray);
    }

    /**
     * 功能名称: 解码
     *
     * @param base64EncodedString 编码内容
     * @return 解码结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 19:59
     */
    default byte[] decodeBase64(String base64EncodedString) throws Exception {
        return new BASE64Decoder().decodeBuffer(base64EncodedString);
    }

    /**
     * 功能名称: 获取密码对象
     *
     * @param cipherCode 密码编码
     * @return 解码结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 19:59
     */
    default Cipher giveCipher(String cipherCode) throws Exception {
        return Cipher.getInstance(StringUtils.isEmpty(cipherCode) ? "AES/CBC/PKCS5Padding" : cipherCode);
    }

    /**
     * 功能名称: 获取密码对象
     *
     * @return 解码结果
     * @description:
     * @author: XXSD
     * @date: 2023-06-30 19:59
     */
    default Cipher giveCipher() throws Exception {
        return giveCipher(null);
    }



    /**
     * 功能描述：加密处理
     *
     * @param srcStr 明文
     * @param srcKey 密钥
     * @param iv     向量
     * @date: 2023/1/31 0031 下午 5:42
     */
    String encrypt(String srcStr, String srcKey, String iv) throws Exception;

    /**
     * 功能描述：加密处理
     *
     * @param srcStr  明文
     * @param charset 字符集，默认utf8
     * @param srcKey  密钥
     * @param iv      向量
     * @date: 2023/1/31 0031 下午 5:42
     */
    String encrypt(String srcStr, Charset charset, String srcKey, String iv) throws Exception;

    /**
     * 解密
     *
     * @param srcStr 密文
     * @param srcKey 密钥
     * @param iv     向量
     * @return 明文
     */
    String decrypt(String srcStr, String srcKey, String iv) throws Exception;

    /**
     * 解密
     *
     * @param srcStr  密文
     * @param srcKey  密钥
     * @param charset 字符集，默认utf8
     * @param iv      向量
     * @return 明文
     */
    String decrypt(String srcStr, Charset charset, String srcKey, String iv) throws Exception;
}
